package org.sam.swing.table;

import java.text.Format;

import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

import org.jdesktop.swingx.table.TableColumnExt;
import org.sam.swing.table.verification.Verificatior;

/**
 * 扩展的列属性对象
 * 
 * @author sam
 *
 */
public class JSTableColumn extends TableColumnExt {

	/**
	 * Creates new table view column with a model index = -1. if -1 the
	 * tableBuidler auto Build index
	 */
	public JSTableColumn() {
		this(-1);
	}

	/**
	 * Creates new table view column with the specified model index.
	 * 
	 * @param modelIndex
	 *            index of table model column to which this view column is
	 *            bound.
	 */
	public JSTableColumn(int modelIndex) {
		this(modelIndex, 75); // default width taken from
								// javax.swing.table.TableColumn
	}

	/**
	 * Creates new table view column with the specified model index and column
	 * width.
	 * 
	 * @param modelIndex
	 *            index of table model column to which this view column is
	 *            bound.
	 * @param width
	 *            pixel width of view column
	 */
	public JSTableColumn(int modelIndex, int width) {
		this(modelIndex, width, null, null);
	}

	/**
	 * Creates new table view column with the specified model index, column
	 * width, cell renderer and cell editor.
	 * 
	 * @param modelIndex
	 *            index of table model column to which this view column is
	 *            bound.
	 * @param width
	 *            pixel width of view column
	 * @param cellRenderer
	 *            the cell renderer which will render all cells in this view
	 *            column
	 * @param cellEditor
	 *            the cell editor which will edit cells in this view column
	 */
	public JSTableColumn(int modelIndex, int width, TableCellRenderer cellRenderer, TableCellEditor cellEditor) {
		super(modelIndex, width, cellRenderer, cellEditor);
	}

	/**
	 * Instantiates a new table view column with all properties copied from the
	 * given original.
	 * 
	 * @param columnExt
	 *            the column to copy properties from
	 * @see #copyFrom(TableColumnExt)
	 */
	public JSTableColumn(TableColumnExt columnExt) {
		this(columnExt.getModelIndex(), columnExt.getWidth(), columnExt.getCellRenderer(), columnExt.getCellEditor());
		copyFrom(columnExt);
	}

	/**
	 * 原始数据字段
	 */
	public static final String COLUMN_ORIGINAL = "col_original";

	/**
	 * 
	 */
	private static final long serialVersionUID = 7093063365050161392L;

	/**
	 * 自动生成新行的时候的默认值
	 */
	protected Object defaultValue;

	/**
	 * 在JSTableColumn对象上扩展一个属性canBeNull；
	 * 当一些特殊类型，用户设置为true时，比如掩码格式的Date类型的时候，用户清空输入，或者设置为0000-00-00
	 * 00:00:00这样的格式后，在后台转换为null； false的时候，提示用户数据的格式不正确，默认样式为单元格边框反红，不允许接受输入。
	 */
	private Boolean canBeNull = false;

	/**
	 * 显示的值表达式
	 */
	protected Format formator;

	/**
	 * 所属列的数据类型
	 */
	protected Class<?> colCls = null;

	/**
	 * 表头的编辑对象
	 */
	protected TableCellEditor headerEditor;

	/**
	 * 显示的值表达式
	 * 
	 * @return
	 */
	public Format getFormator() {
		return formator;
	}

	/**
	 * 显示的值表达式
	 * 
	 * @param formator
	 */
	public void setFormator(Format formator) {
		this.formator = formator;
	}

	/**
	 * 自动生成新行的时候的默认值
	 * 
	 * @return
	 */
	public Object getDefaultValue() {
		return defaultValue;
	}

	/**
	 * 自动生成新行的时候的默认值
	 * 
	 * @param defaultValue
	 */
	public void setDefaultValue(Object defaultValue) {
		this.defaultValue = defaultValue;
	}

	/**
	 * 在JSTableColumn对象上扩展一个属性canBeNull；
	 * 当一些特殊类型，用户设置为true时，比如掩码格式的Date类型的时候，用户清空输入，或者设置为0000-00-00
	 * 00:00:00这样的格式后，在后台转换为null； false的时候，提示用户数据的格式不正确，默认样式为单元格边框反红，不允许接受输入。
	 */
	public Boolean getCanBeNull() {
		return canBeNull;
	}

	/**
	 * 在JSTableColumn对象上扩展一个属性canBeNull；
	 * 当一些特殊类型，用户设置为true时，比如掩码格式的Date类型的时候，用户清空输入，或者设置为0000-00-00
	 * 00:00:00这样的格式后，在后台转换为null； false的时候，提示用户数据的格式不正确，默认样式为单元格边框反红，不允许接受输入。
	 */
	public void setCanBeNull(Boolean canBeNull) {
		this.canBeNull = canBeNull;
	}

	/**
	 * 所属列的数据类型
	 * 
	 * @return
	 */
	public Class<?> getColCls() {
		return colCls;
	}

	/**
	 * 所属列的数据类型
	 * 
	 * @param colCls
	 */
	public void setColCls(Class<?> colCls) {
		this.colCls = colCls;
	}

	/**
	 * 表头编辑器
	 * 
	 * @return
	 */
	public TableCellEditor getHeaderEditor() {
		return headerEditor;
	}

	/**
	 * 表头编辑器
	 * 
	 * @param headerEditor
	 */
	public void setHeaderEditor(TableCellEditor headerEditor) {
		TableCellEditor old = this.headerEditor;
		this.headerEditor = headerEditor;
		firePropertyChange("cellEditor", old, headerEditor);
	}

	/**
	 * 验证器对象
	 */
	private Verificatior verficator;

	/**
	 * 验证器对象
	 * 
	 * @return
	 */
	public Verificatior getVerficator() {
		return verficator;
	}

	/**
	 * 验证器对象
	 * 
	 * @param verficator
	 */
	public void setVerficator(Verificatior verficator) {
		this.verficator = verficator;
		if (this.verficator != null) {
			this.verficator.setParent(this);
		}
	}

	/**
	 * 数据访问工具
	 */
	private DataAccessProvider dataAccessProvider;

	/**
	 * 数据访问工具
	 * 
	 * @return
	 */
	public DataAccessProvider getDataAccessProvider() {
		return dataAccessProvider;
	}

	/**
	 * 数据访问工具
	 * 
	 * @param dataAccessProvider
	 */
	public void setDataAccessProvider(DataAccessProvider dataAccessProvider) {
		this.dataAccessProvider = dataAccessProvider;
	}

	/**
	 * 数据转换工具
	 */
	private DataTranslator dataTranslator;

	/**
	 * 数据转换工具
	 * @return
	 */
	public DataTranslator getDataTranslator() {
		return dataTranslator;
	}

	/**
	 * 数据转换工具
	 * @param dataTranslator
	 */
	public void setDataTranslator(DataTranslator dataTranslator) {
		this.dataTranslator = dataTranslator;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String toString() {
		return this.getIdentifier() == null ? super.toString() : this.getIdentifier().toString();
	}
}
